/* 
 * Esistono tre livelli di profondità, chiamati "zoom", per il metodo DbpediaRegionExecute.
 * zoom 2 = livello di regione
 * zoom 1 = livello di provincia
 * zoom 0 = livello di comune
 * 
 * E' necessario richiamare DbpediaRegionExecute passandogli due parametri:
 * int level = il livello dal quale iniziare la ricerca
 * String resource = la località, del livello associato, da ricercare
 * 
 * Es 1:  spider.DbpediaRegionExecute(2, Italy);
 *      cerca tutte le info delle regioni (livello 2) d'Italia (resource del livello 2 da cercare)
 * 
 * Es 2:  spider.DbpediaRegionExwcute(1, Sicily);
 *      cerca tutte le info delle province (livello 1) della Sicilia (resource del livello 1 da cercare)
 * 
 * I risultati delle ricerche vengono memorizzati in dei Vector e precisamente:
 * 
 * 1) i risultati di una ricerca per tutte le regioni di una nazione in "Vector regioni" 
 * 2) i risultati di una ricerca per tutte le province di una regione in "Vector province"
 * 3) i risultati di una ricerca per tutti i comuni di una provincia in "Vector comuni"
 * 
 * Ogni Vector (regioni/province/comuni) contiene una serie di oggeti della classe Cube(un cubo contiene 
 * le info di una località, qualunque essa sia, regione/provincia/comune) nel quale sono conservate le vere info trovate
 * La classe Cube prevede questi campi:
 * 1) Vector subLevelCube = è il Vector che contiene i cubi delle località del livello sottostante
 * 2) String abs = le info della località del livello attuale
 * 
 * Es: il risultato della ricerca dell' Es 2 di qualche riga fà sarebbe un Vector fatto in questo modo
 * 
 * +---------+----\                      \--+---------+
 * |Cube info|                              |Cuce info|     VECTOR DI TUTTE LE REGIONI D'ITALIA
 * |Sicilia  |                              |Calabria |
 * +---------+----\                     \---+---------+
 *      ^
 *      |
 *      |
 *      |
 *      |
 *      +---------+----\        \---+---------+
 *      |Cube info|                 |Cube info|     VECTOR DI TUTTE LE PROVINCE DELLA SICILIA
 *      |Messina  |                 |Calabria |
 *      +---------+----\        \---+---------+
 *          ^
 *          |
 *          |
 *          |
 *          +---------+---\         \---+---------+
 *          |Cube info|                 |Cube info|     VECTOR DI TUTTI I COMUNI DELLA PROVINCIA DI MESSINA
 *          |Rometta  |                 |Alì      |
 *          +---------+---\         \---+---------+
 * 
 */    

/**
 *
 * @author antonio
 */

import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.*;
import java.util.*;

import SparqlQuery.*;
import Util.*;

public class DbpediaRegion {
    
    private DbpediaQueryFactory dbpediaQuery;
    private DbpediaResourceFactory dbpediaResource;
     
    private Vector province;    //vettore contenente i cubi delle province
    private Vector regioni;     //vettore contenente i cubi delle regioni
    private Vector comuni;      //vettore contenente i cubi dei comuni
    
    private Cube cubixFinal;
    
    public DbpediaRegion()
    {
        dbpediaResource = new DbpediaResourceFactory();
        dbpediaQuery = new DbpediaQueryFactory();
        
        province = new Vector();
        regioni = new Vector();
        comuni = new Vector();
        
        cubixFinal = new Cube();
    }

    
    public void DbpediaRegionExecute(int zoom, String resource)
    {
        if(zoom < 0)    //condizione d'uscita ricorsione
            return ;    // sotto il livello zero (livello del comune) esci
        
        String[] lista = dbpediaResource.getResourceForType(resource);
        
        for(int i=0; i < lista.length; i++)
        {
            dbpediaQuery.setIntLevel(zoom);
            String regionQuery = dbpediaQuery.createQuery(lista[i]);
            ExecuteSparqlQuery x = new ExecuteSparqlQuery(regionQuery);
            ResultSet results = x.connectDbpedia();
        
            this.DbpediaRegionExecute(zoom-1, lista[i]);
        
            switch(zoom)
            {
                case 2:
                    
                    for( ; results.hasNext(); )
                    {
                        QuerySolution soln = results.nextSolution();
                        System.out.print("regione ");
                        String abs = soln.get("abstract").toString();
                        System.out.print(abs + "\t");
                        System.out.print("\n\n");
                        CubeFactory f = new CubeFactory(soln, lista[i]);
                        Cube cubix = f.createCube();
                        cubix.setSubLevelCube((Vector)province.clone()); //inserisco i cubetti delle province nel cubo della regione
                        
                        regioni.add(cubix);
                        province.clear();                   
                    }
                    break;
                
                case 1:
                     
                     for( ; results.hasNext(); )
                     {
                        QuerySolution soln = results.nextSolution();
                        System.out.print("provincia ");
                        String abs = soln.get("abstract").toString();
                        System.out.print(abs + "\t");
                        System.out.print("\n\n"); 
                        CubeFactory f = new CubeFactory(soln, lista[i]);
                        Cube cubix = f.createCube();
                        cubix.setSubLevelCube((Vector)comuni.clone()); //inserisco nel cubo della provincia i cubetti dei comuni della provincia
     
                        province.add(cubix);
                        comuni.clear();                        
                     }
                    break;
                
                case 0:
                    
                    for( ; results.hasNext(); )
                    {
                        QuerySolution soln = results.nextSolution();
                        System.out.print("comune ");
                        String comune = soln.get("comune").toString();
                        System.out.print(comune + "\t");
            
                        String abs = soln.get("abstract").toString();
                        System.out.print(abs + "\t");
                        
                        System.out.print("\n\n");
                        
                        CubeFactory f = new CubeFactory(soln, comune);
                        Cube cubix = f.createCube();
                        
                        comuni.add(cubix); 
                    }
                    
            }
            
        
     }
        
        
       String queryFinal = "PREFIX dbpedia2: <http://dbpedia.org/property/> " +
            "PREFIX : <http://dbpedia.org/resource/> " +
            "SELECT ?abstract WHERE" +
            "{ :" + resource + " dbpedia2:abstract ?abstract ." +
                    "FILTER ( lang(?abstract) = 'it' ) }";
       
       ExecuteSparqlQuery x = new ExecuteSparqlQuery(queryFinal);
       ResultSet results = x.connectDbpedia();
       QuerySolution soln = results.nextSolution();
       String abs = soln.get("abstract").toString();
       cubixFinal.setLabel(resource);
       cubixFinal.setAbs(abs);
       
       switch(zoom)
       {
           case 2:
               cubixFinal.setSubLevelCube(regioni);
               break;
               
           case 1:
               cubixFinal.setSubLevelCube(province);
               break;
               
           case 0:
               cubixFinal.setSubLevelCube(comuni);
               break;
       }
            
        
       return;      
}
    
    
}
















 /*
    private static String query = "PREFIX dbpedia2: <http://dbpedia.org/property/> " +
            "PREFIX : <http://dbpedia.org/resource/>" +
            "SELECT ?comune ?abstract ?km WHERE" +
            "{ ?comune dbpedia2:region :Sicily . " +
            "?comune dbpedia2:abstract ?abstract . " +
            "FILTER ( lang(?abstract) = \'it\' ) . " +
            "?comune dbpedia2:areaTotalKm ?km . }";
    
    public static void main(String[] args)
{
    QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
    try{
        ResultSet results = qexec.execSelect();
   
        for( ; results.hasNext(); )
        {
            QuerySolution soln = results.nextSolution();
            ///////////////////////////////////////////////////////////////
            String comune = soln.get("comune").toString();
            System.out.print(comune + "\t");
            
            String abs = soln.get("abstract").toString();
            System.out.print(abs + "\t");
            
            String km = soln.get("km").toString();
            System.out.print(km);
            
            System.out.print("\n\n");
            ////////////////////////////////////////////////////////////////
            Resource comune = soln.getResource("comune");
            
            Literal  abs = soln.getLiteral("abstract");
            
            Literal km = soln.getLiteral("km");
            
            System.out.print(comune.getURI() + "\t" + abs.getString() + "\t" + km.getInt() + "\n");
        }
        
    }finally{qexec.close();}
    
}
*/